#ifndef EVALUATOR_H
#define EVALUATOR_H

#include "lexeme.h"
#include "environment.h"
#include "f_grammar.h"
#include <fstream>

class Evaluator
{
public:
  Evaluator(FILE* fp);
  ~Evaluator(void);
  Environment EG;
  Lexeme* topTree;
  Lexeme* topEnv;
  F_Grammar* fg;

  //Methods
  Lexeme* start();
  Lexeme* eval(Lexeme* tree, Lexeme* env);
  Lexeme* evalDisplay(Lexeme* tree, Lexeme* env);
  Lexeme* evalSSQ(Lexeme* tree, Lexeme* env);
  Lexeme* evalWhile(Lexeme* tree, Lexeme* env);
  bool isTrue(Lexeme* a);
  Lexeme* evalOp(Lexeme* tree, Lexeme* op, Lexeme* env);
  Lexeme* intOp(Lexeme* a, Lexeme* b, const char* op);
  Lexeme* stringOp(Lexeme* a, Lexeme* b, const char* op);
  Lexeme* evalVarDef(Lexeme* tree, Lexeme* env);
  Lexeme* evalID(Lexeme* tree, Lexeme* env);
  Lexeme* evalAssign(Lexeme* tree, Lexeme* env);
  Lexeme* evalFuncDef(Lexeme* tree, Lexeme* env);
  Lexeme* evalFuncCall(Lexeme* tree, Lexeme* env);
  Lexeme* evalExpression(Lexeme* tree, Lexeme* env);
  Lexeme* evalList(Lexeme* tree, Lexeme* env);
  Lexeme* getParams(Lexeme* func);
  Lexeme* getDefEnv(Lexeme* func);
  Lexeme* getBody(Lexeme* func);
  void printParseTree();
  void printEnvironment();
  void prettyPrint();

  void print(Lexeme* root);
  std::ofstream myfile;
};

#endif